'Python中的数字数据类型'

#Python支持整数，浮点数和复数。他们被定义为int，float和complex在Python数据类型中。
#整数和浮点由存在或不存在小数点分隔。5是整数，而5.0是浮点数。
#复数以形式书写x + yj，其中x是实部，y是虚部。
#我们可以使用type()函数来判断变量或值属于哪种数据类型，并且可以使用函数isinstance()检查它是否属于特定的类型。

a = 5

# 输出: <class 'int'>
print(type(a))

# 输出: <class 'float'>
print(type(5.0))

# 输出: (8+3j)
c = 5 + 3j
print(c + 3)

# 输出: True
print(isinstance(c, complex))

#虽然整数可以是任意长度，但浮点数最多只能精确到15个小数位（第16位不准确）。
#我们每天处理的数字是十进制（以10为底）的数字系统。 但是计算机程序员（通常为嵌入式程序员）需要使用二进制（基数2），十六进制（基数16）和八进制（基数8）的数字系统。
#在Python中，我们可以通过在数字之前添加前缀来表示这些数字。下表列出了这些前缀。

#Binary	        '0b'或'0B'
#Octal	        '0o'或'0O'
#Hexadecimal	'0x'或'0X'

# 输出: 107
print(0b1101011)

# 输出: 253 (251 + 2)
print(0xFB + 0b10)

# 输出: 13
print(0o15)

"数据类型转换"

#我们可以将一种数字转换为另一种数字。这也称为强制转换。
#如果操作数之一是浮点数，则加法，减法等操作会强制整数隐式（自动）浮点。

"Python 小数"

#Python内置类float会执行一些可能令我们惊讶的计算。我们都知道1.1和2.2的总和是3.3，但是Python似乎不同意。

print((1.1 + 2.2) == 3.3)

#到底是怎么回事？
#事实证明，浮点数在计算机硬件中以二进制分数形式实现，因为计算机仅理解二进制（0和1）。由于这个原因，我们知道的大多数十进制小数不能准确地存储在我们的计算机中。
#让我们举个示例。我们不能将分数1/3表示为十进制数。这将给出0.33333333 ...无限长，我们只能对其进行近似。
#原来的十进制小数0.1会导致无限长的二进制分数0.000110011001100110011 ...而我们的计算机只存储了有限数量的二进制数。
#这只会接近0.1，但永远不会相等。因此，这是我们计算机硬件的局限性，而不是Python中的错误。

#为了克服这个问题，我们可以使用Python随附的十进制模块。浮点数的精度最高可以达到15个小数位，而十进制模块具有用户可设置的精度。

import decimal

# 输出: 0.1
print(0.1)

# 输出: Decimal('0.1000000000000000055511151231257827021181583404541015625')
print(decimal.Decimal(0.1))

#当我们要像在学校学习的那样进行十进制计算时，将使用此模块。
#它也保留了意义。我们知道，25.50公斤比25.5公斤更准确，因为它有两位小数，而不是一位。

from decimal import Decimal as D
# 输出: Decimal('3.3')
print(D('1.1') + D('2.2'))

# 输出: Decimal('3.000')
print(D('1.2') * D('2.50'))

#注意上例中的尾随零。
#我们可能会问，为什么不每次都执行Decimal而不是float？主要原因是效率。进行浮点运算必须比十进制运算更快。

#何时使用Decimal而不是float？
#在以下情况下，我们通常使用十进制。

#当我们进行需要精确十进制表示的金融应用程序时。
#当我们要指定所需的精度水平时。
#当我们想实现小数位有效的概念时。
#当我们希望像在学校一样进行运算时

"Python 分数"

#Python通过其fractions模块提供涉及小数的运算。
#小数具有分子和分母，它们都是整数。该模块支持有理数算法。
#我们可以通过多种方式创建Fraction对象。

import fractions

# 输出: 3/2
print(fractions.Fraction(1.5))

# 输出: 5
print(fractions.Fraction(5))

# 输出: 1/3
print(fractions.Fraction(1,3))

#从float创建分数时，我们可能会得到一些异常的结果。这是由于上一节中讨论的二进制浮点数表示不完善所致。
#幸运的是，小数还允许我们使用字符串示例化。这是使用十进制数字时的首选选项。

import fractions
# 用作 float
# 输出: 2476979795053773/2251799813685248
print(fractions.Fraction(1.1))

# 用作 string
# 输出: 11/10
print(fractions.Fraction('1.1'))

#此数据类型支持所有基本操作。
from fractions import Fraction as F

# 输出: 2/3
print(F(1,3) + F(1,3))

# 输出: 6/5
print(1 / F(5,6))

# 输出: False
print(F(-3,10) > 0)

# 输出: True
print(F(-3,10) < 0)

"Python 数学"
#Python提供了类似的模块，math和random可以执行不同的数学运算，例如三角函数，对数，概率和统计等。

import math

# 输出: 3.141592653589793
print(math.pi)

# 输出: -1.0
print(math.cos(math.pi))

# 输出: 22026.465794806718
print(math.exp(10))

# 输出: 3.0
print(math.log10(1000))

# 输出: 1.1752011936438014
print(math.sinh(1))

# 输出: 720
print(math.factorial(6))

#这是Python math模块中可用的完整列表函数和属性。

import random

# 输出: 16
print(random.randrange(10,20))

x = ['a', 'b', 'c', 'd', 'e']

# 得到随机选项
print(random.choice(x))

# 打乱x列表顺序
random.shuffle(x)

# 打印输出被打乱顺序后的x
print(x)

# 打印随机元素
print(random.random())
#这是Python random模块中可用的完整列表函数和属性。
